package 剑指Offer;

public class Offer56I_数组中数字出现的次数 {
    public int[] singleNumbers(int[] nums) {
        int x = 0, y = 0, n = 0, m = 1;
        //遍历异或，最后得到的n就是两个不相同的数异或的结果
        for (int num : nums) {
            n = n ^ num;
        }

        //m=1=0001(二进制)，用m来找到二进制n中从右往左的第一个1
        while ((m & n) == 0) {
            m = m << 1;//不为1就把m左移
        }

        for (int num : nums) {              // 3. 遍历 nums 分组
            if ((num & m) != 0) {
                x ^= num;  // 4. 当 num & m != 0
            } else {
                y ^= num;                // 4. 当 num & m == 0
            }
        }
        return new int[]{x, y};          // 5. 返回出现一次的数字
    }
}
